package pkg

import "context"

// 退出管理器
type GracefulShutdown struct {
	// 用于控制退出的上下文
	Ctx    context.Context
	Cancel context.CancelFunc

	isShutdown bool     // 是否已经退出
	cleanFunc  []func() // 退出时的清理函数，按添加顺序倒序执行
}

var GS = &GracefulShutdown{}

func init() {
	GS.Ctx, GS.Cancel = context.WithCancel(context.Background())
}
func (sf *GracefulShutdown) Shutdown() {
	if sf.isShutdown {
		return
	}

	sf.Cancel() // 通知所有监听者退出

	// 执行清理函数
	for i := len(sf.cleanFunc) - 1; i >= 0; i-- {
		sf.cleanFunc[i]()
	}
}

// 注册清理函数，在退出时执行
func (sf *GracefulShutdown) RegisterCleanFunc(f func()) {
	sf.cleanFunc = append(sf.cleanFunc, f)
}
